home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / c_toolbx.arc / SORTCOMP.C < prev    next >
Encoding:
C/C++ Source or Header  |  1988-03-30  |  2.1 KB  |  85 lines

  1. /*  sortcomp.c - data driven compare function */
  2. #include   "stdio.h"
  3. #include   "cminor.h"
  4. #include   "sortcomp.h"
  5.  
  6. extern int nkeys ;        /* number of fields to compare */
  7. extern SORTKEY keys[] ;     /* array of sort field definitions */
  8.  
  9. /* define pointer types for data type conversinos */
  10. typedef int16 *PINT  ;
  11. typedef int32 *PLONG ;
  12. typedef float *PFLOAT ;
  13.  
  14. int sortcomp(p1,p2)        /* compares records */
  15.   char    *p1 ;            /* pointer to first data record */
  16.   char    *p2 ;            /* pointer to second data record */
  17.   {
  18.      int i ;
  19.      SORTKEY  *p ;
  20.      char  *pt1  ,
  21.        *pt2  ;
  22.      int   ichar ;
  23.  
  24.      p = keys ;         /* point to first sort key desc. */
  25.      for( i=0 ; i<nkeys ; i=i+1)
  26.     {  pt1 = p1 + p->kstart ;    /* get starting address of */
  27.        pt2 = p2 + p->kstart ;    /* fileds in the two records */
  28.        switch( p->ktype)
  29.           {
  30.           case   int16_key    :
  31.          if( *(PINT)pt1 != *(PINT)pt2 )
  32.              {    if( *(PINT)pt1 > *(PINT)pt2 )
  33.                 return( p->korder ) ;
  34.             else return( - p->korder) ;
  35.              }
  36.          break ;
  37.           case   char_key    :
  38.          ichar = p->klength  ;
  39.          while( ichar > 0 )
  40.              {    if( *pt1 != *pt2 )
  41.               {  if( *pt1 > *pt2 )
  42.                 return( p->korder ) ;
  43.                  else return( - p->korder ) ;
  44.                }
  45.             pt1 = pt1+1 ; pt2 = pt2+1 ; ichar = ichar - 1 ;
  46.              }
  47.          break ;
  48.           case   string_key :
  49.          ichar = p->klength ;
  50.          while( ichar > 0 )
  51.              {    if( *pt1 != *pt2 )
  52.             {  if( *pt1 > *pt2 )
  53.                 return( p->korder ) ;
  54.                else retyrn( - p->korder ) ;
  55.             }
  56.             if( *pt1 == '\0' )
  57.                 break ;
  58.             pt1 = pt1+1 ; pt2 = pt2+1 ; ichar = ichar - 1 ;
  59.              }    ;
  60.          break ;
  61.           case   int32_key    :
  62.          if( *(PLONG)pt1 != *(PLONG)pt2 )
  63.              {    if( *(PLONG)pt1 > *(PLONG)pt2 )
  64.                 return( p->korder ) ;
  65.             else return( - p->korder ) ;
  66.              }
  67.          break ;
  68.           case   float_key    :
  69.          if( *(PFLOAT)pt1 != *(PFLOAT)pt2 )
  70.              {
  71.             if( (*((float *)pt1)) > (*((float *)pt2)) )
  72.                 return( p->korder ) ;
  73.             else return( - p->korder ) ;
  74.              }
  75.          break ;
  76.           }
  77.        p = p + 1 ;            /* point to next sort field desc. */
  78.     }
  79.                     /* all keys were equal */
  80.     return( 0 ) ;            /* return "equal to" results */
  81.   }
  82.  
  83.  
  84.  
  85.